import { DEFAULT_BASE_URL, DEFAULT_TIMEOUT } from "./config";
import axios from "axios";
import { compact } from "lodash";

// 创建一个 axios 实例
let axiosInstance = axios.create({
  baseURL: DEFAULT_BASE_URL,
  timeout: DEFAULT_TIMEOUT,
});

export const initApiFactory = (config: {
  baseURL?: string;
  timeout?: number;
}) => {
  const {
    baseURL = DEFAULT_BASE_URL,
    timeout = DEFAULT_TIMEOUT,
  } = config;
  axiosInstance = axios.create({
    baseURL,
    timeout,
  });

  // 添加请求拦截器
  axiosInstance.interceptors.request.use(
    (config) => {
      // 在发送请求之前做些什么
      // 比如添加认证 token 到请求头
      // config.headers["Authorization"] = `Bearer ${access_token}`;

      // 你也可以在这里显示加载指示器
      // store.commit('setLoading', true); // 如果你使用 Vuex

      return config;
    },
    (error) => {
      // 对请求错误做些什么
      return Promise.reject(error);
    },
  );

  // 添加响应拦截器
  axiosInstance.interceptors.response.use(
    (response) => {
      // 对响应数据做点什么
      // 比如在响应成功时隐藏加载指示器
      // store.commit('setLoading', false); // 如果你使用 Vuex

      // 你也可以在这里对响应数据进行一些统一处理
      // 比如格式化数据、检查某些字段等

      return response;
    },
    (error) => {
      // 对响应错误做点什么
      // 比如统一处理错误消息、显示错误通知等

      // 你可以在这里检查错误状态码，并根据需要抛出错误或返回默认值
      if (error.response) {
        // 请求已发出，但服务器响应了状态码不在 2xx 范围
        // 你可以在这里处理不同的状态码
        console.error(
          "Response error:",
          error.response.status,
          error.response.data,
        );
      } else if (error.request) {
        // 请求已发出，但没有收到响应
        // 比如网络错误、服务器宕机等
        console.error("Request error:", error.request);
      } else {
        // 其他错误
        // 比如请求配置错误等
        console.error("Error:", error.message);
      }

      // 你可以根据需要抛出错误或返回一个带有错误信息的 Promise
      return Promise.reject(error);
    },
  );
};
export const httpGet = async (
  url: string,
  queryParam: { [key: string]: any },
  urlParam: Array<string> = [],
): Promise<any> => {
  // 构造 URL 参数部分
  const queryString = new URLSearchParams(queryParam).toString();

  // 构造 URL 路径部分
  const fullPath = compact([url, urlParam.join("/")]).join("/");

  // 如果有查询参数，则附加到 URL 上
  const fullUrl = compact([fullPath, queryString]).join("?");

  // 发起 GET 请求
  return await axiosInstance.get(fullUrl);
};

export const httpPost = async (url: string, data: any) => {
  return await axiosInstance.post(url, data);
};

export interface ApiFactoryParam {
  path: string;
  method: "GET" | "POST";
}
export type ApiFunctionReturnType = (
  param: Record<string, any>,
) => Promise<any>;

export default function apiFactory(
  param: ApiFactoryParam,
): ApiFunctionReturnType {
  if (param.method === "GET") {
    return (_param: Record<string, any>) => httpGet(param.path, _param);
  } else if (param.method === "POST") {
    return (_param: Record<string, any>) => httpPost(param.path, _param);
  } else {
    throw new Error(`apiFactory 未实现:${param.method}`);
  }
}
